package com.hspedu.encap;

/**
 * @Author Stringzhua
 * @Date 2024/3/1 14:58
 * description:
 * 封装快速入门案例
 * 要求:
 * 不能随便查看人的年龄、工资等隐私,并对设置的年龄进行合理的验证.
 * 年龄合理的就设置,否则给默认年龄
 * 年龄范围必须在1~120范围
 * 工资不能直接查看
 * name的长度在2~6之间
 */
public class Encapsulation {
    public static void main(String[] args) {
        //如果要使用ctrl+f10,需要先配置主类
        //第一次用鼠标点击形式运行程序,后面就可以使用快捷键
        Person person = new Person();
        person.name = "jack";
//        person.age=3000;//无法直接赋值
//        name的长度在2~6之间
        person.setName("jack");
        person.setAge(30);
        person.setSalary(300000);
        System.out.println(person.info());
        System.out.println(person.getSalary());

        //如果我们直接使用构造器指定属性，getter和setter方法,使用构造器绕过去就失效了
        //此时可以将set方法写在构造器中,这样仍然可以验证数据
        Person smith = new Person("smith", 2000, 60000);
        System.out.println("===smith的信息===");
        System.out.println(smith.info());
    }
}

class Person {
    public String name;//名字公开
    private int age;//年龄私有化
    private double salary;//工资私有化

    //构造器 alt+inset Constructor
    public Person() {//无参构造器
    }

    public Person(String name, int age, double salary) {//有三个属性的构造器
//        this.name = name;
//        this.age = age;
//        this.salary = salary;
        //我们可以将set方法写在构造器中,这样仍然可以验证数据
        setName(name);//等价于this.setName(name);
        setAge(age);
        setSalary(salary);
    }

    public void setName(String name) {
        //加入对数据的校验和检测,相当于增加了业务逻辑
        if (name.length() >= 2 && name.length() <= 6) {
            this.name = name;
        } else {
            System.out.println("名字的长度不对,需要2~6个字符,默认名字");
            this.name = "无名人";
        }
    }

    public String getName(String name) {
        return name;
    }

    //自己写setXX,getXX太慢,可以使用快捷键alt+insert
    //然后根据要求来完善我们的代码
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 1 && age <= 120) {//如果是合理范围
            this.age = age;
        } else {
            System.out.println("你设置的年龄不对，范围需要在1~120,这里已设置默认年龄18");
            this.age = 18;//给一个默认年龄
        }
    }

    public double getSalary() {
        //可以这里增加对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    //写一个方法,返回信息
    public String info() {
        return "信息为 name=" + name + "  age=" + age + "  薪水=" + salary;
    }
}